package com.dkakunsi.monev.dao;

import java.util.List;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;

import com.dkakunsi.monev.entity.Kegiatan;
import com.dkakunsi.monev.entity.Program;
import com.dkakunsi.monev.util.MonevDataException;

@Repository("KegiatanHibernateRepository")
public class KegiatanDao extends GenericDao<Kegiatan> {
	@Override
	public void save(Kegiatan k) {
		super.save(k);
	}
	
	public Kegiatan isExist(Kegiatan k) {
		try {
			Kegiatan kOri = get(k.getId());
			kOri.copyValue(k);
			return kOri;
		} catch (MonevDataException e) {
			return k;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Kegiatan> getAll(int tahunAnggaran) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.tahunAnggaran = :tahun ORDER BY k.program");
		query.setParameter("tahun", tahunAnggaran);
		
		return checkNull(query.list());
	}
	
	@SuppressWarnings("unchecked")
	public List<Kegiatan> get(Program program) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.program = :program");
		query.setParameter("program", program);
		
		return checkNull(query.list());
	}
	
	@SuppressWarnings("unchecked")
	public List<Kegiatan> get(Program program, String instansi) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.program = :program AND k.instansiTerkait = :instansi ORDER BY k.tahunAnggaran");
		query.setParameter("program", program);
		query.setParameter("instansi", instansi);
		
		return checkNull(query.list());
	}
	
	@SuppressWarnings("unchecked")
	public List<Kegiatan> get(Program program, int tahunAnggaran) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.program = :program AND k.tahunAnggaran = :tahun ORDER BY k.instansiTerkait");
		query.setParameter("program", program);
		query.setParameter("tahun", tahunAnggaran);
		
		return checkNull(query.list());
	}

	@SuppressWarnings("unchecked")
	public List<Kegiatan> get(Program program, int tahunAnggaran, String instansi) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.program = :program AND k.tahunAnggaran = :tahun AND k.instansiTerkait = :instansi");
		query.setParameter("program", program);
		query.setParameter("tahun", tahunAnggaran);
		query.setParameter("instansi", instansi);
		
		return checkNull(query.list());
	}

	@SuppressWarnings("unchecked")
	public List<Kegiatan> get(String instansiTerkait) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.instansiTerkait = :instansiTerkait ORDER BY k.program");
		query.setParameter("instansiTerkait", instansiTerkait);
		
		return checkNull(query.list());
	}
	
	@SuppressWarnings("unchecked")
	public List<Kegiatan> get(String instansiTerkait, int tahunAnggaran) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.instansiTerkait = :instansiTerkait AND tahunAnggaran = :tahun ORDER BY k.program");
		query.setParameter("instansiTerkait", instansiTerkait);
		query.setParameter("tahun", tahunAnggaran);
		
		return checkNull(query.list());
	}
	
	@SuppressWarnings("unchecked")
	public List<Kegiatan> getBySumberDana(String sumberDana) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.sumberDana = :sumberDana ORDER BY k.program");
		query.setParameter("sumberDana", sumberDana);
		
		return checkNull(query.list());
	}

	@SuppressWarnings("unchecked")
	public List<Kegiatan> getByNama(String name) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.nama LIKE :nama ORDER BY k.program");
		query.setParameter("nama", name);
		
		return checkNull(query.list());
	}

	@SuppressWarnings("unchecked")
	public List<Kegiatan> getByNama(String name, String instansi) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.nama LIKE :nama AND k.instansiTerkait = :instansi ORDER BY k.program");
		query.setParameter("nama", name);
		query.setParameter("instansi", instansi);
		
		return checkNull(query.list());
	}

	@SuppressWarnings("unchecked")
	public List<Kegiatan> getByNama(String name, int tahunAnggaran) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.nama LIKE :nama AND k.tahunAnggaran = :tahun ORDER BY k.program");
		query.setParameter("nama", name);
		query.setParameter("tahun", tahunAnggaran);
		
		return checkNull(query.list());
	}
	
	@SuppressWarnings("unchecked")
	public List<Kegiatan> getByNama(String name, int tahunAnggaran, String instansi) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.nama LIKE :nama AND k.tahunAnggaran = :tahun AND k.instansiTerkait = :instansi ORDER BY k.program");
		query.setParameter("nama", name);
		query.setParameter("tahun", tahunAnggaran);
		query.setParameter("instansi", instansi);
		
		return checkNull(query.list());
	}
	
	@SuppressWarnings("unchecked")
	public List<Kegiatan> getBySumberDana(String sumberDana, String instansi) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.sumberDana = :sumberDana AND k.instansiTerkait = :instansu ORDER BY k.program");
		query.setParameter("sumberDana", sumberDana);
		query.setParameter("instansi", instansi);
		
		return checkNull(query.list());
	}
	
	@SuppressWarnings("unchecked")
	public List<Kegiatan> getBySumberDana(String sumberDana, int tahunAnggaran) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.sumberDana = :sumberDana AND tahunAnggaran = :tahun ORDER BY k.program");
		query.setParameter("sumberDana", sumberDana);
		query.setParameter("tahun", tahunAnggaran);
		
		return checkNull(query.list());
	}
	
	@SuppressWarnings("unchecked")
	public List<Kegiatan> getBySumberDana(String sumberDana, int tahunAnggaran, String instansi) throws MonevDataException {
		Query query = getSession().createQuery("SELECT k FROM Kegiatan k WHERE k.sumberDana = :sumberDana AND tahunAnggaran = :tahun AND k.instansiTerkait = :instansi ORDER BY k.program");
		query.setParameter("sumberDana", sumberDana);
		query.setParameter("tahun", tahunAnggaran);
		query.setParameter("instansi", instansi);
		
		return checkNull(query.list());
	}
	
	@SuppressWarnings("unchecked")
	public List<String> getListInstansi() {
		Query query = getSession().createQuery("SELECT DISTINCT k.instansiTerkait FROM Kegiatan k");
		
		return query.list();
	}
}
